﻿using Black.Minecraft.Editor.Models;
using Black.Minecraft.Editor.ViewModels.Core;
using System;

namespace Black.Minecraft.Editor.ViewModels.DataModels
{
    /// <summary>
    /// DataModel pour un la définition d'un item
    /// </summary>
    public class ItemDataModel : BaseViewModel
    {
        #region Propriétés

        /// <summary>
        /// Obtient si l'object peut être enchanté
        /// </summary>
        public bool CanEnchant
        {
            get
            {
                return (this._data.CanEnchant);
            }
            set
            {
                if (this._data.CanEnchant != value)
                {
                    this._data.CanEnchant = value;
                    this.OnPropertyChanged();
                }
            }
        }

        /// <summary>
        /// Obtient si l'object peut être réparer
        /// </summary>
        public bool CanRepair
        {
            get
            {
                return (this._data.CanRepair);
            }
            set
            {
                if (this._data.CanRepair != value)
                {
                    this._data.CanRepair = value;
                    this.OnPropertyChanged();
                }
            }
        }

        /// <summary>
        /// Obtient le sous id (Damage)
        /// </summary>
        public short Damage
        {
            get
            {
                return (this._data.Damage);
            }
            set
            {
                if (this._data.Damage != value)
                {
                    this._data.Damage = value;
                    this.OnPropertyChanged();
                }
            }
        }

        /// <summary>
        /// Obtient le type d'équipement
        /// </summary>
        public EquipmentType EquipmentType
        {
            get
            {
                return ((EquipmentType)this._data.EquipmentType);
            }
        }

        /// <summary>
        /// Obtient si l'objet possède une image
        /// </summary>
        public bool HaveImage
        {
            get
            {
                return (this._image != null);
            }
        }

        /// <summary>
        /// Obtient l'identiiant de l'objet
        /// </summary>
        public short Id
        {
            get
            {
                return (this._data.Id);
            }
            set
            {
                if (this._data.Id != value)
                {
                    this._data.Id = value;
                    this.OnPropertyChanged();
                }
            }
        }

        /// <summary>
        /// Obtient l'image associé a l'objet
        /// </summary>
        public Uri Image
        {
            get
            {
                return (this._image);
            }
        }

        /// <summary>
        /// Obtient le nombre max d'une stack de l'objet
        /// </summary>
        public byte MaxStack
        {
            get
            {
                return (this._data.MaxStack);
            }
            set
            {
                if (this._data.MaxStack != value)
                {
                    this._data.MaxStack = value;
                    this.OnPropertyChanged();
                }
            }
        }

        /// <summary>
        /// Obtient ou définit le nom de l'objet
        /// </summary>
        public string Name
        {
            get
            {
                return (this._data.Name);
            }
            set
            {
                if (this._data.Name != value)
                {
                    this._data.Name = value;
                    this.OnPropertyChanged();
                }
            }
        }

        #endregion

        #region Variables d'instances

        private Uri _image;
        private Item _data;

        #endregion

        #region Constructeurs

        /// <summary>
        /// Constructeur de la classe
        /// </summary>
        /// <param name="data">Source de donnée</param>
        public ItemDataModel(Item data)
        {
            // Initialisation

            this._data = data;
            this._image = new Uri("/Assets/Empty.png", UriKind.RelativeOrAbsolute);

            // Si fake pas d'image

            if (data.Id == -1)
                return;

            // Récupération de l'icone

            if (this._data.Custom)
                this._image = new Uri("/Assets/Unkhown.png", UriKind.RelativeOrAbsolute);
            else if (this._data.Damage > 0)
                this._image = new Uri(string.Format("/Assets/Icons/{0}-{1}.png", data.Id, data.Damage), UriKind.RelativeOrAbsolute);
            else
                this._image = new Uri(string.Format("/Assets/Icons/{0}.png", data.Id), UriKind.RelativeOrAbsolute);
        }

        #endregion

        #region Fonctions publiques

        /// <summary>
        /// Retourne la source de donnée
        /// </summary>
        /// <returns></returns>
        public Item GetData()
        {
            return (this._data);
        }

        #endregion
    }
}
